Mapas e Dashs

Aula 20, M3

Carolina Musso

Sala de Situação - UnB

Esta semana

Aula 19 - Mapas

  • O que é GIS, como usar ggplot para Mapas …

Aula 20 - Mapas Iterativos

  • Um gostinho de mapas iterativos para dashboards

Mas antes!

Rotulos

rm(list=ls())  #limpa  o ambient
if (!require(pacman)) install.packages("pacman") #garante que tem o pacman
pacman::p_load(tidyverse, rio, sf, rnaturalearth, geobr, 
               lubridate, ggspatial, ggthemes, gsubfn)
brasil_bruto <- import("Exercicios/covid_br_2022.csv")
regiao_geobr <- read_region() %>% 
  rename(regiao=`name_region`) %>% 
  mutate(regiao=if_else(regiao=="Centro Oeste", "Centro-Oeste", regiao))

Downloading: 1.2 kB     
Downloading: 1.2 kB     
Downloading: 13 kB     
Downloading: 13 kB     
Downloading: 18 kB     
Downloading: 18 kB     
Downloading: 18 kB     
Downloading: 18 kB     
Downloading: 18 kB     
Downloading: 18 kB     
Downloading: 26 kB     
Downloading: 26 kB     
Downloading: 26 kB     
Downloading: 26 kB     
Downloading: 26 kB     
Downloading: 26 kB     
Downloading: 34 kB     
Downloading: 34 kB     
Downloading: 34 kB     
Downloading: 34 kB     
Downloading: 34 kB     
Downloading: 34 kB     
Downloading: 42 kB     
Downloading: 42 kB     
Downloading: 42 kB     
Downloading: 42 kB     
Downloading: 50 kB     
Downloading: 50 kB     
Downloading: 50 kB     
Downloading: 50 kB     
Downloading: 58 kB     
Downloading: 58 kB     
Downloading: 58 kB     
Downloading: 58 kB     
Downloading: 67 kB     
Downloading: 67 kB     
Downloading: 67 kB     
Downloading: 67 kB     
Downloading: 75 kB     
Downloading: 75 kB     
Downloading: 83 kB     
Downloading: 83 kB     
Downloading: 91 kB     
Downloading: 91 kB     
Downloading: 91 kB     
Downloading: 91 kB     
Downloading: 91 kB     
Downloading: 91 kB     
Downloading: 99 kB     
Downloading: 99 kB     
Downloading: 99 kB     
Downloading: 99 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 320 kB     
Downloading: 320 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 330 kB     
Downloading: 340 kB     
Downloading: 340 kB     
Downloading: 340 kB     
Downloading: 340 kB     
Downloading: 350 kB     
Downloading: 350 kB     
Downloading: 360 kB     
Downloading: 360 kB     
Downloading: 360 kB     
Downloading: 360 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 370 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 380 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 390 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 400 kB     
Downloading: 420 kB     
Downloading: 420 kB     
Downloading: 430 kB     
Downloading: 430 kB     
Downloading: 440 kB     
Downloading: 440 kB     
Downloading: 450 kB     
Downloading: 450 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 460 kB     
Downloading: 470 kB     
Downloading: 470 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 480 kB     
Downloading: 490 kB     
Downloading: 490 kB     
Downloading: 490 kB     
Downloading: 490 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 500 kB     
Downloading: 510 kB     
Downloading: 510 kB     
Downloading: 530 kB     
Downloading: 530 kB     
Downloading: 530 kB     
Downloading: 530 kB     
Downloading: 540 kB     
Downloading: 540 kB     
Downloading: 570 kB     
Downloading: 570 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 580 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 590 kB     
Downloading: 600 kB     
Downloading: 600 kB     
Downloading: 600 kB     
Downloading: 600 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 610 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 620 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 630 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 640 kB     
Downloading: 650 kB     
Downloading: 650 kB     
Downloading: 660 kB     
Downloading: 660 kB     
Downloading: 660 kB     
Downloading: 660 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 670 kB     
Downloading: 680 kB     
Downloading: 680 kB     
Downloading: 710 kB     
Downloading: 710 kB     
Downloading: 710 kB     
Downloading: 710 kB     
Downloading: 730 kB     
Downloading: 730 kB     
Downloading: 740 kB     
Downloading: 740 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 750 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 760 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 770 kB     
Downloading: 780 kB     
Downloading: 780 kB     
Downloading: 780 kB     
Downloading: 780 kB     
brasil_regiao <- brasil_bruto %>% 
  filter(codmun != "") %>% 
  group_by(regiao) %>% 
  summarise(Maximo_dia=max(casosNovos, na.rm=T)) %>% 
  right_join(regiao_geobr)

com_label <- brasil_regiao %>% 
  ggplot(aes(geometry=geom))+
  geom_sf()+
  geom_sf_label(aes(geometry=geom,label = regiao))

Norte e escala

tanzania <- ne_countries(country="united republic of tanzania", type="countries", scale='large', returnclass = "sf")

g1 <- ggplot(data = tanzania) +
    geom_sf()+
  xlab("Longitude") + ylab("Latitude") +
    ggtitle("The United Republic of Tanzania") +
    annotation_scale(location = "bl", width_hint = 0.4) +
    annotation_north_arrow(location = "bl", which_north = "true", 
        pad_x = unit(0.0, "in"), pad_y = unit(0.2, "in"),
        style = north_arrow_fancy_orienteering)
g1

pontos com geom_point

city_data <- data.frame(city_name=c("Dar es Salaam", "Mwanza", "Arusha", "Dodoma", "Mbeya"))
city_data$lat <- c(-6.7924,-2.5164,-3.3869,-6.1630,-8.9094)
city_data$lon <- c(39.2083,32.9175,36.6830,35.7516,33.4608)

g2 <- ggplot(data = tanzania) +
    geom_sf() +
    xlab("Longitude") + ylab("Latitude") +
    ggtitle("Major Cities in the United Republic of Tanzania") +
    annotation_scale(location = "bl", width_hint = 0.4) +
    annotation_north_arrow(location = "bl", which_north = "true", 
        pad_x = unit(0.0, "in"), pad_y = unit(0.2, "in"),
        style = north_arrow_fancy_orienteering) +
  geom_point(data = city_data, mapping = aes(x = lon, y = lat), colour = "red") +
  geom_text(data = city_data, mapping=aes(x=lon, y=lat, label=city_name), nudge_y = 0.5, color="darkblue")
g2

Finalmente

nc <- sf::st_read(system.file("shape/nc.shp", package="sf"))
Reading layer `nc' from data source 
  `/Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/library/sf/shape/nc.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 100 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
Geodetic CRS:  NAD27
#> Reading layer `nc' from data source `/Library/Frameworks/R.framework/Versions/3.6/Resources/library/sf/shape/nc.shp' using driver `ESRI Shapefile'
#> Simple feature collection with 100 features and 14 fields
#> geometry type:  MULTIPOLYGON
#> dimension:      XY
#> bbox:           xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> epsg (SRID):    4267
#> proj4string:    +proj=longlat +datum=NAD27 +no_defs

centroid <- ggplot(nc) +
  geom_sf() +
  geom_point(
    aes(color = SID74, size = AREA, geometry = geometry),
    stat = "sf_coordinates"
  ) +
  scale_color_viridis_c(option = "C") +
  theme(legend.position = "bottom")
centroid

Leituras para aprofundamento

Dashboards

  • Shiny , o mais famoso, poderoso, flexível, R e Python.

  • Veja aqui

  • Mas …pode ser bem difícil

Veja o código

penguins_csv <- "https://raw.githubusercontent.com/jcheng5/simplepenguins.R/main/penguins.csv"

df <- readr::read_csv(penguins_csv)
# Find subset of columns that are suitable for scatter plot
df_num <- df |> select(where(is.numeric), -Year)

ui <- page_sidebar(
  theme = bs_theme(bootswatch = "minty"),
  sidebar = sidebar(
    varSelectInput("xvar", "X variable", df_num, selected = "Bill Length (mm)"),
    varSelectInput("yvar", "Y variable", df_num, selected = "Bill Depth (mm)"),
    checkboxGroupInput(
      "species", "Filter by species",
      choices = unique(df$Species), 
      selected = unique(df$Species)
    ),
    hr(), # Add a horizontal rule
    checkboxInput("by_species", "Show species", TRUE),
    checkboxInput("show_margins", "Show marginal plots", TRUE),
    checkboxInput("smooth", "Add smoother"),
  ),
  plotOutput("scatter")
)

server <- function(input, output, session) {
  subsetted <- reactive({
    req(input$species)
    df |> filter(Species %in% input$species)
  })

  output$scatter <- renderPlot({
    p <- ggplot(subsetted(), aes(!!input$xvar, !!input$yvar)) + list(
      theme(legend.position = "bottom"),
      if (input$by_species) aes(color = Species),
      geom_point(),
      if (input$smooth) geom_smooth()
    )

    if (input$show_margins) {
      margin_type <- if (input$by_species) "density" else "histogram"
      p <- ggExtra::ggMarginal(p, type = margin_type, margins = "both",
        size = 8, groupColour = input$by_species, groupFill = input$by_species)
    }

    p
  }, res = 100)
}

shinyApp(ui, server)

Outra opção

  • Flexdashboard

  • Baseado em R Markdown

  • Pode ser salvo em html, partilhado ou publicado em uma página simples.

  • Precisamos então…

Da preparação de sempre

rm(list=ls())  #limpa  o ambient
if (!require(pacman)) install.packages("pacman") #garante que tem o pacman
pacman::p_load(tidyverse, rio, sf, rnaturalearth,  geobr,
               lubridate, ggspatial, ggthemes, gsubfn, ggsn,
               leaflet, htmlwidgets, flexdashboard, shiny, 
               bslib,ggExtra, plotly ) 

pacman::p_load_gh("yutannihilation/ggsflabel")

Veja como abrir o arquivo de Dashboard

Flexdashboard

Cabeçalho YAML

---
title: "Meu primeiro Dash"
author: "Professora maravilhosa"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
    self-contained: true
---
  • Exemplos

    • Meu primeiro Dashboard
    • Veja o trabalho de Bruna Paes

Vamos aos mapas!

Leaflet

  • JavaScript
  • Na prática acaba sendo tipo um ggplot, mas as camadas são adicionadas com o %>% mesmo.

Exemplo

Onde o R Nasceu

leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")

Brasil

regiao_geobr <- read_region() %>% 
  rename(regiao=`name_region`) %>% 
  mutate(regiao=if_else(regiao=="Centro Oeste", "Centro-Oeste", regiao))

brasil_bruto <- import("Exercicios/covid_br_2022.csv")

brasil_regiao <- brasil_bruto %>% 
  filter(codmun != "") %>% 
  group_by(regiao) %>% 
  summarise(Maximo_dia=max(casosNovos, na.rm=T)) 

brasil_regiao_geom <- brasil_regiao%>% 
  left_join(regiao_geobr) %>% 
  mutate(LL=st_coordinates(st_centroid(geom)))


leaflet(brasil_regiao_geom) %>%
  addTiles() %>% 
  addCircles(lng = ~LL[,"X"], lat = ~LL[,"Y"], weight = 1,
    radius = ~Maximo_dia*10, popup = ~paste(regiao, 
                                            format(Maximo_dia, big.mark="."), "casos"
  ))

Já que estamos aqui…

graf <- brasil_regiao %>% 
  ggplot(aes(x=regiao, y=Maximo_dia))+
  geom_col()

ggplotly(graf)

Gostaram?